package com.dd.stack.se.stream.concurrent;

/**
 * @Author liuxianmeng
 * @CreateTime 2025/9/4 18:37
 * @Description 类功能作用说明
 */
public class VolatileDemo {
    // 未使用volatile：可能导致线程2无法感知flag的变化
    // private static boolean flag = false;

    // 使用volatile：保证flag的可见性
    private static volatile boolean flag = false;
    //private static boolean flag = false;

    public static void main(String[] args) {
        // 线程1：修改flag的值
        new Thread(() -> {
            try {
                Thread.sleep(1000); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = true; // 修改flag
            System.out.println("线程1已将flag设为true");
        }).start();

        // 线程2：读取flag的值
        new Thread(() -> {
            while (!flag) {
                // 若flag无volatile修饰，线程2可能一直循环（读取缓存的旧值）
                // 若有volatile修饰，线程2会立即感知flag的变化并退出循环
            }
            System.out.println("线程2检测到flag为true，退出循环");
        }).start();
    }
}

